﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CPS1
{
    /// <summary>
    /// Klasa od sygnału skoku      
    /// </summary>
    public class VaultSignal : Signal
    {
        /// <summary>
        /// Czas skoku
        /// </summary>
        public Double ts;
        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="A">Amplituda</param>
        /// <param name="t1">Czas początkowy</param>
        /// <param name="ts">Czas skoku</param>
        /// <param name="d">Czas trwania sygnału</param>
        /// <param name="f">Częstotliwość próbkowania</param>
        /// <param name="name">Nazwa sygnału</param>
        public VaultSignal(Double A, Double t1, Double ts, Double d, Double f, String name) 
        {
            // przypisanie wartości do pól klasy
            this.A = A;
            this.t1 = t1;
            this.ts = ts;
            this.d = d;
            this.f = f;
            this.name = name;
            this.periodical = false;
            this.discrete = false;
            // określenie ilości próbek - czas trwania sygnału pomnożony przez jego częstotliwość próbkowania
            int amount = (int) Math.Ceiling(d * f);
            // definicja tablicy na wartości
            this.calculatedValues = new Double[amount, 2];
        }
        /// <summary>
        /// Funkcja zwracająca wartości sygnału
        /// </summary>
        /// <param name="t">Czas</param>
        /// <returns>Wartość funkcji w danym momencie</returns>
        override public Double value(Double t) 
        {
            if (t < ts) return 0; // gdy czas mniejszy od czasu skoku - zwróć 0
            else if (t == ts) return (1.0 / 2.0) * this.A; // gdy czas równy czasowi skoku - zwróć (1/2) * Amplituda
            else return this.A; // gdy czas większy od czasu skoku - zwróć Amplitudę
        }
        /// <summary>
        /// Funkcja wykonująca kopię obiektu sygnału
        /// </summary>
        /// <returns>Kopia sygnału</returns>
        public override Signal copy()
        {
            // tworzymy kopię wykorzystując w konstruktorze wartości pól bieżącej klasy
            VaultSignal copied = new VaultSignal(this.A, this.t1, this.ts, this.d, this.f, this.name);
            // obliczamy wartości sygnału
            copied.calculateSignal();
            // zwracamy sygnał
            return copied;
        }
    }
}
